package data

import (
	"context"
	"medicine/internal/biz"
)

// productRepo 商品仓储实现，负责商品相关数据库操作
// 实现了 ProductRepo 接口
type productRepo struct {
	data *DataRepo // 数据层依赖，包含数据库和缓存
}

func NewProductRepo(data *DataRepo) biz.ProductRepo {
	return &productRepo{data: data}
}

// Save 保存商品到数据库
func (r *productRepo) Save(ctx context.Context, p *biz.Product) (*biz.Product, error) {
	if err := r.data.DB.WithContext(ctx).Create(p).Error; err != nil {
		return nil, err
	}
	return p, nil
}

// Update 更新商品信息
func (r *productRepo) Update(ctx context.Context, p *biz.Product) (*biz.Product, error) {
	if err := r.data.DB.WithContext(ctx).Save(p).Error; err != nil {
		return nil, err
	}
	return p, nil
}

// FindByID 根据ID查询商品
func (r *productRepo) FindByID(ctx context.Context, id int64) (*biz.Product, error) {
	var p biz.Product
	if err := r.data.DB.WithContext(ctx).First(&p, id).Error; err != nil {
		return nil, err
	}
	return &p, nil
}

// List 分页查询商品列表
func (r *productRepo) List(ctx context.Context, page, pageSize int) ([]*biz.Product, int, error) {
	var products []*biz.Product
	var total int64
	db := r.data.DB.WithContext(ctx)
	db.Model(&biz.Product{}).Count(&total)
	db = db.Offset((page - 1) * pageSize).Limit(pageSize)
	if err := db.Find(&products).Error; err != nil {
		return nil, 0, err
	}
	return products, int(total), nil
}

// Delete 删除商品
func (r *productRepo) Delete(ctx context.Context, id int64) error {
	return r.data.DB.WithContext(ctx).Delete(&biz.Product{}, id).Error
}

// CategoryExists 校验分类是否存在
func (r *productRepo) CategoryExists(ctx context.Context, categoryId int64) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Category{}).Where("id = ?", categoryId).Count(&count)
	return count > 0
}

// BrandExists 校验品牌是否存在
func (r *productRepo) BrandExists(ctx context.Context, brandId int64) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Brand{}).Where("id = ?", brandId).Count(&count)
	return count > 0
}

// NameExists 校验商品名唯一性
func (r *productRepo) NameExists(ctx context.Context, name string) bool {
	var count int64
	r.data.DB.WithContext(ctx).Model(&biz.Product{}).Where("name = ?", name).Count(&count)
	return count > 0
}
